Матч
343, Факторизуемое число (RefactorableNumber)
Дивизион 1,
Уровень 3
Число называется факторизуемым,
если оно делится на число его делителей. Например, следующие числа являются
факторизуемыми: 1 (1 делитель), 12 (6 делителей), 9 (3 делителя). Числа 7 (2
делителя), 16 (5 делителей) не являются факторизуемыми.
В задаче требуется определить
количество факторизуемых чисел на промежутке от low до high включительно.
Класс: RefactorableNumber
Метод: int count(int low, int high)
Ограничения:
1 £ low £ 2 * 106, low £ high £ 2 * 106.
Вход. Два числа low
и high.
Выход. Количество факторизуемых чисел на промежутке от low до
high
включительно.
Пример входа
low |
high |
1 |
10 |
10 |
100 |
25 |
35 |
Пример выхода
4
12
0
РЕШЕНИЕ
факторизация
Объявим массив d длины 2000001, в
который методом, аналогичным решету Эратосфена, занесем количество делителей натуральных
чисел (d[i] равно
количеству делителей числа i). Далее просматриваем все ячейки массива d от low до
high
и подсчитываем количество таких i, для которых i делится на d[i] (количество факторизуемых чисел
от low
до high).
ПРОГРАММА
#include <stdio.h>
#include <memory.h>
#define MAX 2000001
int d[MAX];
class RefactorableNumber
{
public:
int count(int low, int high)
{
int i, j, res;
memset(d,0,sizeof(d));
for(i = 1; i < MAX; i++)
for(j = i; j <= MAX; j += i) d[j]++;
res = 0;
for(i = low; i <= high; i++)
if (i % d[i] == 0) res++;
return res;
}
};